/**
 * 测试数据初始化脚本 (Node.js 版本)
 * 
 * 使用方法:
 * node scripts/init_test_data_node.js
 * 
 * 需要先安装依赖:
 * npm install mongodb bcryptjs
 */

const { MongoClient, ObjectId } = require('mongodb');
const bcrypt = require('bcryptjs');

// 配置
const MONGO_URI = 'mongodb://42.194.245.236:27017';
const DB_NAME = 'zk_code_arena';

// 测试题目标题
const TEST_PROBLEM_TITLES = ['A+B Problem', '数组排序', '字符串反转'];

async function main() {
    console.log('========================================');
    console.log('开始初始化测试数据...');
    console.log('========================================\n');

    const client = new MongoClient(MONGO_URI);

    try {
        // 连接数据库
        console.log('📡 连接 MongoDB...');
        await client.connect();
        console.log('✅ MongoDB 连接成功\n');

        const db = client.db(DB_NAME);

        // ============================================
        // 1. 清理旧测试数据
        // ============================================
        console.log('1. 清理旧测试数据...');

        // 删除测试用户 (保留 admin)
        await db.collection('users').deleteMany({
            username: { $in: ['test_user_1', 'test_user_2'] }
        });

        // 删除测试题目和相关测试用例
        const testProblems = await db.collection('problems').find({
            title: { $in: TEST_PROBLEM_TITLES }
        }).toArray();

        const testProblemIds = testProblems.map(p => p._id);
        if (testProblemIds.length > 0) {
            await db.collection('test_cases').deleteMany({ problem_id: { $in: testProblemIds } });
            await db.collection('submits').deleteMany({ problem_id: { $in: testProblemIds } });
            await db.collection('problems').deleteMany({ _id: { $in: testProblemIds } });
        }

        console.log('✓ 旧测试数据清理完成\n');

        // ============================================
        // 2. 创建测试用户
        // ============================================
        console.log('2. 创建测试用户...');

        // 加密密码
        const hashedPassword = await bcrypt.hash('test123', 10);

        const testUsers = [
            {
                username: 'test_user_1',
                password: hashedPassword,
                email: 'user1@test.com',
                real_name: '测试用户1',
                role: 'student',
                is_active: true,
                created_at: new Date(),
                updated_at: new Date()
            },
            {
                username: 'test_user_2',
                password: hashedPassword,
                email: 'user2@test.com',
                real_name: '测试用户2',
                role: 'student',
                is_active: true,
                created_at: new Date(),
                updated_at: new Date()
            }
        ];

        const userInsertResult = await db.collection('users').insertMany(testUsers);
        console.log(`✓ 创建了 ${Object.keys(userInsertResult.insertedIds).length} 个测试用户`);
        console.log('  - test_user_1 (密码: test123)');
        console.log('  - test_user_2 (密码: test123)\n');

        // 使用第一个测试用户作为题目创建者
        const testUser1Id = userInsertResult.insertedIds[0];
        console.log(`ℹ️  使用 test_user_1 作为题目创建者 (ID: ${testUser1Id})\n`);

        // ============================================
        // 3. 创建测试题目
        // ============================================
        console.log('3. 创建测试题目...');

        const testProblemsData = [
            {
                title: 'A+B Problem',
                description: `# 题目描述

计算两个整数的和。

## 输入格式

一行两个整数 a 和 b，用空格分隔。

## 输出格式

一行一个整数，表示 a + b 的值。

## 数据范围

- -10^9 ≤ a, b ≤ 10^9

## 样例输入 1
\`\`\`
1 2
\`\`\`

## 样例输出 1
\`\`\`
3
\`\`\`

## 样例输入 2
\`\`\`
100 200
\`\`\`

## 样例输出 2
\`\`\`
300
\`\`\``,
                difficulty: 'easy',
                time_limit: 1000,
                memory_limit: 128,
                tags: ['数学', '入门', '基础'],
                status: 'published',
                is_public: true,
                created_by: testUser1Id,
                submit_count: 0,
                accept_count: 0,
                created_at: new Date(),
                updated_at: new Date()
            },
            {
                title: '数组排序',
                description: `# 题目描述

给定一个整数数组，请将其按升序排序。

## 输入格式

第一行一个整数 n，表示数组长度。
第二行 n 个整数，表示数组元素。

## 输出格式

一行 n 个整数，表示排序后的数组，用空格分隔。

## 数据范围

- 1 ≤ n ≤ 10^5
- -10^9 ≤ 数组元素 ≤ 10^9

## 样例输入
\`\`\`
5
3 1 4 2 5
\`\`\`

## 样例输出
\`\`\`
1 2 3 4 5
\`\`\``,
                difficulty: 'medium',
                time_limit: 2000,
                memory_limit: 256,
                tags: ['排序', '数组', '算法'],
                status: 'published',
                is_public: true,
                created_by: testUser1Id,
                submit_count: 0,
                accept_count: 0,
                created_at: new Date(),
                updated_at: new Date()
            },
            {
                title: '字符串反转',
                description: `# 题目描述

给定一个字符串，请将其反转输出。

## 输入格式

一行一个字符串（不含空格）。

## 输出格式

一行一个字符串，表示反转后的结果。

## 数据范围

- 1 ≤ 字符串长度 ≤ 10^5
- 字符串仅包含小写字母和数字

## 样例输入 1
\`\`\`
hello
\`\`\`

## 样例输出 1
\`\`\`
olleh
\`\`\`

## 样例输入 2
\`\`\`
world
\`\`\`

## 样例输出 2
\`\`\`
dlrow
\`\`\``,
                difficulty: 'easy',
                time_limit: 1000,
                memory_limit: 128,
                tags: ['字符串', '基础'],
                status: 'published',
                is_public: true,
                created_by: testUser1Id,
                submit_count: 0,
                accept_count: 0,
                created_at: new Date(),
                updated_at: new Date()
            }
        ];

        const problemInsertResult = await db.collection('problems').insertMany(testProblemsData);
        const insertedProblemIds = Object.values(problemInsertResult.insertedIds);
        console.log(`✓ 创建了 ${insertedProblemIds.length} 个测试题目`);
        console.log('  - A+B Problem (简单)');
        console.log('  - 数组排序 (中等)');
        console.log('  - 字符串反转 (简单)\n');

        // ============================================
        // 4. 创建测试用例
        // ============================================
        console.log('4. 创建测试用例...');

        // A+B Problem 测试用例
        const apbTestCases = [
            { input: '1 2', output: '3', is_sample: true },
            { input: '100 200', output: '300', is_sample: true },
            { input: '0 0', output: '0', is_sample: false },
            { input: '-1 1', output: '0', is_sample: false },
            { input: '999999 1', output: '1000000', is_sample: false }
        ].map(tc => ({
            ...tc,
            problem_id: insertedProblemIds[0],
            score: 20,
            created_at: new Date(),
            updated_at: new Date()
        }));

        // 数组排序测试用例
        const sortTestCases = [
            { input: '5\n3 1 4 2 5', output: '1 2 3 4 5', is_sample: true },
            { input: '3\n1 2 3', output: '1 2 3', is_sample: true },
            { input: '1\n42', output: '42', is_sample: false },
            { input: '4\n4 3 2 1', output: '1 2 3 4', is_sample: false },
            { input: '5\n5 5 5 5 5', output: '5 5 5 5 5', is_sample: false }
        ].map(tc => ({
            ...tc,
            problem_id: insertedProblemIds[1],
            score: 20,
            time_limit: 3000,
            created_at: new Date(),
            updated_at: new Date()
        }));

        // 字符串反转测试用例
        const reverseTestCases = [
            { input: 'hello', output: 'olleh', is_sample: true },
            { input: 'world', output: 'dlrow', is_sample: true },
            { input: 'a', output: 'a', is_sample: false },
            { input: '12345', output: '54321', is_sample: false },
            { input: 'racecar', output: 'racecar', is_sample: false }
        ].map(tc => ({
            ...tc,
            problem_id: insertedProblemIds[2],
            score: 20,
            created_at: new Date(),
            updated_at: new Date()
        }));

        // 插入所有测试用例
        const allTestCases = [...apbTestCases, ...sortTestCases, ...reverseTestCases];
        const testCaseInsertResult = await db.collection('test_cases').insertMany(allTestCases);
        console.log(`✓ 创建了 ${Object.keys(testCaseInsertResult.insertedIds).length} 个测试用例`);
        console.log('  - A+B Problem: 5个用例 (2个示例 + 3个隐藏)');
        console.log('  - 数组排序: 5个用例 (2个示例 + 3个隐藏)');
        console.log('  - 字符串反转: 5个用例 (2个示例 + 3个隐藏)\n');

        // ============================================
        // 5. 数据验证
        // ============================================
        console.log('5. 数据验证...');

        const userCount = await db.collection('users').countDocuments({ 
            username: { $in: ['test_user_1', 'test_user_2'] } 
        });
        const problemCount = await db.collection('problems').countDocuments({ 
            title: { $in: TEST_PROBLEM_TITLES } 
        });
        const testCaseCount = await db.collection('test_cases').countDocuments({ 
            problem_id: { $in: insertedProblemIds } 
        });

        console.log(`✓ 用户数量: ${userCount} (预期: 2)`);
        console.log(`✓ 题目数量: ${problemCount} (预期: 3)`);
        console.log(`✓ 测试用例数量: ${testCaseCount} (预期: 15)`);

        if (userCount === 2 && problemCount === 3 && testCaseCount === 15) {
            console.log('\n✅ 所有测试数据初始化成功!');
        } else {
            console.log('\n⚠️  警告: 数据数量不匹配，请检查!');
        }

        // ============================================
        // 6. 输出测试数据信息
        // ============================================
        console.log('\n========================================');
        console.log('测试数据信息');
        console.log('========================================\n');

        console.log('📝 测试账号:');
        console.log('  用户名: test_user_1');
        console.log('  密码: test123');
        console.log('  邮箱: user1@test.com\n');

        console.log('  用户名: test_user_2');
        console.log('  密码: test123');
        console.log('  邮箱: user2@test.com\n');

        console.log('📚 测试题目:');
        testProblemsData.forEach((problem, index) => {
            const problemId = insertedProblemIds[index];
            console.log(`  ${index + 1}. ${problem.title}`);
            console.log(`     ID: ${problemId}`);
            console.log(`     难度: ${problem.difficulty}`);
            console.log(`     时间限制: ${problem.time_limit}ms`);
            console.log(`     内存限制: ${problem.memory_limit}MB`);
            console.log(`     测试用例: 5个 (2个示例 + 3个隐藏)\n`);
        });

        console.log('========================================');
        console.log('初始化完成!');
        console.log('========================================');

    } catch (error) {
        console.error('\n❌ 错误:', error.message);
        console.error(error.stack);
        process.exit(1);
    } finally {
        await client.close();
    }
}

// 执行主函数
main().catch(console.error);
